home *** CD-ROM | disk | FTP | other *** search
/ Freelog 115 / FreelogNo115-MaiJuin2013.iso / Internet / AvantBrowser / asetup.exe / _data / webkit / resources.pak / Unnamed File 000100.txt < prev    next >
Text File  |  2013-04-03  |  6KB  |  182 lines

  1. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4.  
  5. // require: cr.js
  6. // require: cr/ui.js
  7. // require: cr/ui/tree.js
  8.  
  9. cr.define('chrome.sync', function() {
  10.   /**
  11.    * Gets all children of the given node and passes it to the given
  12.    * callback.
  13.    * @param {string} id The id whose children we want.
  14.    * @param {function(Array.<!Object>)} callback The callback to call
  15.    *     with the list of children summaries.
  16.    */
  17.   function getSyncNodeChildrenSummaries(id, callback) {
  18.     var timer = chrome.sync.makeTimer();
  19.     chrome.sync.getChildNodeIds(id, function(childNodeIds) {
  20.       console.debug('getChildNodeIds took ' +
  21.                     timer.elapsedSeconds + 's to retrieve ' +
  22.                     childNodeIds.length + ' ids');
  23.       timer = chrome.sync.makeTimer();
  24.       chrome.sync.getNodeSummariesById(
  25.           childNodeIds, function(childrenSummaries) {
  26.         console.debug('getNodeSummariesById took ' +
  27.                       timer.elapsedSeconds + 's to retrieve summaries for ' +
  28.                       childrenSummaries.length + ' nodes');
  29.         callback(childrenSummaries);
  30.       });
  31.     });
  32.   }
  33.  
  34.   /**
  35.    * Creates a new sync node tree item.
  36.    * @param {{id: string, title: string, isFolder: boolean}}
  37.    *     nodeSummary The nodeSummary object for the node (as returned
  38.    *     by chrome.sync.getNodeSummariesById()).
  39.    * @constructor
  40.    * @extends {cr.ui.TreeItem}
  41.    */
  42.   var SyncNodeTreeItem = function(nodeSummary) {
  43.     var treeItem = new cr.ui.TreeItem({
  44.       id_: nodeSummary.id
  45.     });
  46.     treeItem.__proto__ = SyncNodeTreeItem.prototype;
  47.  
  48.     treeItem.label = nodeSummary.title;
  49.     if (nodeSummary.isFolder) {
  50.       treeItem.mayHaveChildren_ = true;
  51.  
  52.       // Load children asynchronously on expand.
  53.       // TODO(akalin): Add a throbber while loading?
  54.       treeItem.triggeredLoad_ = false;
  55.       treeItem.addEventListener('expand',
  56.                                 treeItem.handleExpand_.bind(treeItem));
  57.     } else {
  58.       treeItem.classList.add('leaf');
  59.     }
  60.     return treeItem;
  61.   };
  62.  
  63.   SyncNodeTreeItem.prototype = {
  64.     __proto__: cr.ui.TreeItem.prototype,
  65.  
  66.     /**
  67.      * Retrieves the details for this node.
  68.      * @param {function(Object)} callback The callback that will be
  69.      *    called with the node details, or null if it could not be
  70.      *    retrieved.
  71.      */
  72.     getDetails: function(callback) {
  73.       chrome.sync.getNodeDetailsById([this.id_], function(nodeDetails) {
  74.         callback(nodeDetails[0] || null);
  75.       });
  76.     },
  77.  
  78.     handleExpand_: function(event) {
  79.       if (!this.triggeredLoad_) {
  80.         getSyncNodeChildrenSummaries(this.id_, this.addChildNodes_.bind(this));
  81.         this.triggeredLoad_ = true;
  82.       }
  83.     },
  84.  
  85.     /**
  86.      * Adds children from the list of children summaries.
  87.      * @param {Array.<{id: string, title: string, isFolder: boolean}>}
  88.      *    childrenSummaries The list of children summaries with which
  89.      *    to create the child nodes.
  90.      */
  91.     addChildNodes_: function(childrenSummaries) {
  92.       var timer = chrome.sync.makeTimer();
  93.       for (var i = 0; i < childrenSummaries.length; ++i) {
  94.         var childTreeItem = new SyncNodeTreeItem(childrenSummaries[i]);
  95.         this.add(childTreeItem);
  96.       }
  97.       console.debug('adding ' + childrenSummaries.length +
  98.                     ' children took ' + timer.elapsedSeconds + 's');
  99.     }
  100.   };
  101.  
  102.   /**
  103.    * Updates the node detail view with the details for the given node.
  104.    * @param {!Object} nodeDetails The details for the node we want
  105.    *     to display.
  106.    */
  107.   function updateNodeDetailView(nodeDetails) {
  108.     var nodeBrowser = document.getElementById('node-browser');
  109.     // TODO(akalin): Write a nicer detail viewer.
  110.     nodeDetails.entry = JSON.stringify(nodeDetails.entry, null, 2);
  111.     jstProcess(new JsEvalContext(nodeDetails), nodeBrowser);
  112.   }
  113.  
  114.   /**
  115.    * Creates a new sync node tree.
  116.    * @param {Object=} opt_propertyBag Optional properties.
  117.    * @constructor
  118.    * @extends {cr.ui.Tree}
  119.    */
  120.   var SyncNodeTree = cr.ui.define('tree');
  121.  
  122.   SyncNodeTree.prototype = {
  123.     __proto__: cr.ui.Tree.prototype,
  124.  
  125.     decorate: function() {
  126.       cr.ui.Tree.prototype.decorate.call(this);
  127.       this.addEventListener('change', this.handleChange_.bind(this));
  128.       chrome.sync.getRootNodeDetails(this.makeRoot_.bind(this));
  129.     },
  130.  
  131.     /**
  132.      * Creates the root of the tree.
  133.      * @param {{id: string, title: string, isFolder: boolean}}
  134.      *    rootNodeSummary The summary info for the root node.
  135.      */
  136.     makeRoot_: function(rootNodeSummary) {
  137.       // The root node usually doesn't have a title.
  138.       rootNodeSummary.title = rootNodeSummary.title || 'Root';
  139.       var rootTreeItem = new SyncNodeTreeItem(rootNodeSummary);
  140.       this.add(rootTreeItem);
  141.     },
  142.  
  143.     handleChange_: function(event) {
  144.       if (this.selectedItem) {
  145.         this.selectedItem.getDetails(updateNodeDetailView);
  146.       }
  147.     }
  148.   };
  149.  
  150.   function decorateSyncNodeBrowser(syncNodeBrowser) {
  151.     cr.ui.decorate(syncNodeBrowser, SyncNodeTree);
  152.   }
  153.  
  154.   // This is needed because JsTemplate (which is needed by
  155.   // updateNodeDetailView) is loaded at the end of the file after
  156.   // everything else.
  157.   //
  158.   // TODO(akalin): Remove dependency on JsTemplate and get rid of
  159.   // this.
  160.   var domLoaded = false;
  161.   var pendingSyncNodeBrowsers = [];
  162.   function decorateSyncNodeBrowserAfterDOMLoad(id) {
  163.     var e = document.getElementById(id);
  164.     if (domLoaded) {
  165.       decorateSyncNodeBrowser(e);
  166.     } else {
  167.       pendingSyncNodeBrowsers.push(e);
  168.     }
  169.   }
  170.  
  171.   document.addEventListener('DOMContentLoaded', function() {
  172.     for (var i = 0; i < pendingSyncNodeBrowsers.length; ++i) {
  173.       decorateSyncNodeBrowser(pendingSyncNodeBrowsers[i]);
  174.     }
  175.     domLoaded = true;
  176.   });
  177.  
  178.   return {
  179.     decorateSyncNodeBrowser: decorateSyncNodeBrowserAfterDOMLoad
  180.   };
  181. });
  182.